home *** CD-ROM | disk | FTP | other *** search
/ OpenGL Superbible (2nd Edition) / OpenGL SuperBible e2.iso / tools / GLUT-3.7 / PROGS / DEMOS / CHESS / CHESS.C < prev    next >
Encoding:
C/C++ Source or Header  |  1998-08-12  |  25.6 KB  |  996 lines

  1. /*
  2.  * chess.c - part of the chess demo in the glut distribution.
  3.  *
  4.  * (C) Henk Kok (kok@wins.uva.nl)
  5.  *
  6.  * This file can be freely copied, changed, redistributed, etc. as long as
  7.  * this copyright notice stays intact.
  8.  */
  9.  
  10. #include <stdlib.h>
  11. #include <stdio.h>
  12. #include <GL/glut.h>
  13. #include <math.h>
  14. #include "chess.h"
  15.  
  16. #if 0
  17. /* Uncomment to debug various scenarios. */
  18. #undef GL_VERSION_1_1
  19. #undef GL_EXT_texture_object
  20. #undef GL_EXT_texture
  21. #endif
  22.  
  23. #ifndef GL_VERSION_1_1
  24.  
  25. #if defined(GL_EXT_texture_object) && defined(GL_EXT_texture)
  26. #define glGenTextures glGenTexturesEXT
  27. #define glBindTexture glBindTextureEXT
  28. #else
  29. #define USE_DISPLAY_LISTS
  30. #endif
  31.  
  32. #endif
  33.  
  34. /* Some <math.h> files do not define M_PI... */
  35. #ifndef M_PI
  36. #define M_PI 3.14159265358979323846
  37. #endif
  38.  
  39. int texturing = 0;
  40. int reflection = 0;
  41. int chaos = 0;
  42. int chaosPieces = 0;
  43. int animating = 1;
  44. static GLuint texName[3];
  45.  
  46. extern int path[10][10], piece, piece2;
  47.  
  48. extern GLfloat CX1, CY1, CX2, CY2, CZ2;
  49.  
  50. #define WIT    0
  51. #define ZWART    16
  52.  
  53. int board[10][10];
  54.  
  55. GLubyte white_square[TXSX][TXSY][3];
  56. GLubyte black_square[TXSX][TXSY][3];
  57. GLubyte wood[TXSX][TXSY][3];
  58.  
  59. extern GLfloat lightpos[];
  60.  
  61. GLfloat buf[256], phase;
  62. GLfloat transl[48];
  63. int list[48];
  64.  
  65. GLfloat width[144], height[144];
  66. GLfloat bwidth, bheight;
  67.  
  68. int cycle[10][10], cyclem, cycle2;
  69. int stunt[10][10], stuntm, stunt2;
  70.  
  71. GLfloat blackamb[4] = { 0.2, 0.1, 0.1, 0.5 };
  72. GLfloat blackdif[4] = { 0.2, 0.1, 0.0, 0.5 };
  73. GLfloat blackspec[4] = { 0.5, 0.5, 0.5, 0.5 };
  74.  
  75. GLfloat whiteamb[4] = { 0.7, 0.7, 0.4, 0.5 };
  76. GLfloat whitedif[4] = { 0.8, 0.7, 0.4, 0.5 };
  77. GLfloat whitespec[4] = { 0.8, 0.7, 0.4, 0.5 };
  78.  
  79. GLfloat copperamb[4] = { 0.24, 0.2, 0.07, 1.0 };
  80. GLfloat copperdif[4] = { 0.75, 0.61, 0.22, 1.0 };
  81. GLfloat copperspec[4] = { 0.32, 0.25, 0.17, 1.0 };
  82.  
  83. GLfloat darkamb[4] = { 0.10, 0.10, 0.10, 1.0 };
  84. GLfloat darkdif[4] = { 0.6, 0.6, 0.6, 1.0 };
  85. GLfloat darkspec[4] = { 0.25, 0.25, 0.25, 1.0 };
  86.  
  87. GLdouble ClipPlane[4] = { 0.0, 1.0, 0.0, 0.0 };
  88.  
  89. void white_texture(void)
  90. {
  91.     glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, whitedif);
  92.     glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, whiteamb);
  93.     glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, whitespec);
  94.     glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, 40.0);
  95. }
  96.  
  97. void black_texture(void)
  98. {
  99.     glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, blackdif);
  100.     glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, blackamb);
  101.     glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, blackspec);
  102.     glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, 40.0);
  103. }
  104.  
  105. void copper_texture(void)
  106. {
  107.     glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, copperdif);
  108.     glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, copperamb);
  109.     glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, copperspec);
  110.     glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, 40.0);
  111. }
  112.  
  113. void dark_texture(void)
  114. {
  115.     glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, darkdif);
  116.     glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, darkamb);
  117.     glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, darkspec);
  118.     glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, 40.0);
  119. }
  120.  
  121. void border_texture(void)
  122. {
  123.     glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, copperdif);
  124.     glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, copperamb);
  125.     glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, copperspec);
  126.     glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, 90.0);
  127. }
  128.  
  129. void init_textures(void)
  130. {
  131. #if !defined(USE_DISPLAY_LISTS)
  132.     glGenTextures(3, texName);
  133. #else
  134.     texName[0] = 1000;
  135.     texName[1] = 1001;
  136.     texName[2] = 1002;
  137. #endif
  138.     GenerateTextures();
  139.     glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
  140.  
  141. #if !defined(USE_DISPLAY_LISTS)
  142.     glBindTexture(GL_TEXTURE_2D, texName[0]);
  143. #else
  144.     glNewList(texName[0], GL_COMPILE);
  145. #endif
  146.     glTexImage2D(GL_TEXTURE_2D, 0, 3, TXSX, TXSY, 0, GL_RGB,
  147.     GL_UNSIGNED_BYTE, &wood[0][0][0]);
  148.     glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
  149.     glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
  150.     glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  151.     glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  152.     glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
  153. #if defined(USE_DISPLAY_LISTS)
  154.     glEndList();
  155. #endif
  156.  
  157. #if !defined(USE_DISPLAY_LISTS)
  158.     glBindTexture(GL_TEXTURE_2D, texName[1]);
  159. #else
  160.     glNewList(texName[1], GL_COMPILE);
  161. #endif
  162.     glTexImage2D(GL_TEXTURE_2D, 0, 3, TXSX, TXSY, 0, GL_RGB,
  163.     GL_UNSIGNED_BYTE, &white_square[0][0][0]);
  164.     glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
  165.     glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
  166.     glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  167.     glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  168.     glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
  169. #if defined(USE_DISPLAY_LISTS)
  170.     glEndList();
  171. #endif
  172.  
  173. #if !defined(USE_DISPLAY_LISTS)
  174.     glBindTexture(GL_TEXTURE_2D, texName[2]);
  175. #else
  176.     glNewList(texName[2], GL_COMPILE);
  177. #endif
  178.     glTexImage2D(GL_TEXTURE_2D, 0, 3, TXSX, TXSY, 0, GL_RGB,
  179.     GL_UNSIGNED_BYTE, &black_square[0][0][0]);
  180.     glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
  181.     glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
  182.     glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  183.     glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  184.     glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
  185. #if defined(USE_DISPLAY_LISTS)
  186.     glEndList();
  187. #endif
  188. }
  189.  
  190. void do_border(void)
  191. {
  192.     glPushMatrix();
  193.     glTranslatef(-0.5, 0.0, -0.5);
  194.     if (texturing)
  195.     {
  196. #if !defined(USE_DISPLAY_LISTS)
  197.     glBindTexture(GL_TEXTURE_2D, texName[0]);
  198. #else
  199.         glCallList(texName[0]);
  200. #endif
  201.     glEnable(GL_TEXTURE_2D);
  202.     } else
  203.     border_texture();
  204.  
  205.     glBegin(GL_QUADS);
  206.     glNormal3f(0.0, 1.0, 0.0);
  207.     glTexCoord2f(0.0, 0.0); glVertex3f(0.0, 0.08, 0.0);
  208.     glTexCoord2f(0.6, 0.0); glVertex3f(8.0, 0.08, 0.0);
  209.     glTexCoord2f(0.6, 0.6); glVertex3f(8.5, 0.08, -0.5);
  210.     glTexCoord2f(0.0, 0.6); glVertex3f(-0.5, 0.08, -0.5);
  211.  
  212.     glTexCoord2f(0.0, 0.0); glVertex3f(8.0, 0.08, 0.0);
  213.     glTexCoord2f(0.6, 0.0); glVertex3f(8.0, 0.08, 8.0);
  214.     glTexCoord2f(0.6, 0.6); glVertex3f(8.5, 0.08, 8.5);
  215.     glTexCoord2f(0.0, 0.6); glVertex3f(8.5, 0.08, -0.5);
  216.  
  217.     glTexCoord2f(0.0, 0.0); glVertex3f(8.0, 0.08, 8.0);
  218.     glTexCoord2f(0.6, 0.0); glVertex3f(0.0, 0.08, 8.0);
  219.     glTexCoord2f(0.6, 0.6); glVertex3f(-0.5, 0.08, 8.5);
  220.     glTexCoord2f(0.0, 0.6); glVertex3f(8.5, 0.08, 8.5);
  221.  
  222.     glTexCoord2f(0.0, 0.0); glVertex3f(0.0, 0.08, 8.0);
  223.     glTexCoord2f(0.6, 0.0); glVertex3f(0.0, 0.08, 0.0);
  224.     glTexCoord2f(0.6, 0.6); glVertex3f(-0.5, 0.08, -0.5);
  225.     glTexCoord2f(0.0, 0.6); glVertex3f(-0.5, 0.08, 8.5);
  226.     glEnd();
  227.  
  228.     glBegin(GL_QUADS);
  229.     glNormal3f(0.0, 0.0, 1.0);
  230.     glTexCoord2f(0.0, 0.0); glVertex3f(0.0, 0.08, 0.0);
  231.     glTexCoord2f(0.6, 0.0); glVertex3f(8.0, 0.08, 0.0);
  232.     glTexCoord2f(0.6, 0.6); glVertex3f(8.0, -0.08, 0.0);
  233.     glTexCoord2f(0.0, 0.6); glVertex3f(0.0, -0.08, 0.0);
  234.  
  235.     glNormal3f(0.0, 1.0, 0.0);
  236.     glTexCoord2f(0.0, 0.0); glVertex3f(8.0, 0.08, 0.0);
  237.     glTexCoord2f(0.6, 0.0); glVertex3f(8.0, 0.08, 8.0);
  238.     glTexCoord2f(0.6, 0.6); glVertex3f(8.0, -0.08, 8.0);
  239.     glTexCoord2f(0.0, 0.6); glVertex3f(8.0, -0.08, 0.0);
  240.  
  241.     glNormal3f(0.0, 0.0, 1.0);
  242.     glTexCoord2f(0.0, 0.0); glVertex3f(8.0, 0.08, 8.0);
  243.     glTexCoord2f(0.6, 0.0); glVertex3f(0.0, 0.08, 8.0);
  244.     glTexCoord2f(0.6, 0.6); glVertex3f(0.0, -0.08, 8.0);
  245.     glTexCoord2f(0.0, 0.6); glVertex3f(8.0, -0.08, 8.0);
  246.  
  247.     glNormal3f(0.0, 1.0, 0.0);
  248.     glTexCoord2f(0.0, 0.0); glVertex3f(0.0, 0.08, 8.0);
  249.     glTexCoord2f(0.6, 0.0); glVertex3f(0.0, 0.08, 0.0);
  250.     glTexCoord2f(0.6, 0.6); glVertex3f(0.0, -0.08, 0.0);
  251.     glTexCoord2f(0.0, 0.6); glVertex3f(0.0, -0.08, 8.0);
  252.     glEnd();
  253.  
  254.     glBegin(GL_QUADS);
  255.     glNormal3f(0.0, 0.0, 1.0);
  256.     glTexCoord2f(0.0, 0.0); glVertex3f(-0.5, 0.08, -0.5);
  257.     glTexCoord2f(0.6, 0.0); glVertex3f(8.5, 0.08, -0.5);
  258.     glTexCoord2f(0.6, 0.6); glVertex3f(8.5, -0.08, -0.5);
  259.     glTexCoord2f(0.0, 0.6); glVertex3f(-0.5, -0.08, -0.5);
  260.  
  261.     glNormal3f(0.0, 1.0, 0.0);
  262.     glTexCoord2f(0.0, 0.0); glVertex3f(8.5, 0.08, -0.5);
  263.     glTexCoord2f(0.6, 0.0); glVertex3f(8.5, 0.08, 8.5);
  264.     glTexCoord2f(0.6, 0.6); glVertex3f(8.5, -0.08, 8.5);
  265.     glTexCoord2f(0.0, 0.6); glVertex3f(8.5, -0.08, -0.5);
  266.  
  267.     glNormal3f(0.0, 0.0, 1.0);
  268.     glTexCoord2f(0.0, 0.0); glVertex3f(8.5, 0.08, 8.5);
  269.     glTexCoord2f(0.6, 0.0); glVertex3f(-0.5, 0.08, 8.5);
  270.     glTexCoord2f(0.6, 0.6); glVertex3f(-0.5, -0.08, 8.5);
  271.     glTexCoord2f(0.0, 0.6); glVertex3f(8.5, -0.08, 8.5);
  272.  
  273.     glNormal3f(0.0, 1.0, 0.0);
  274.     glTexCoord2f(0.0, 0.0); glVertex3f(-0.5, 0.08, 8.5);
  275.     glTexCoord2f(0.6, 0.0); glVertex3f(-0.5, 0.08, -0.5);
  276.     glTexCoord2f(0.6, 0.6); glVertex3f(-0.5, -0.08, -0.5);
  277.     glTexCoord2f(0.0, 0.6); glVertex3f(-0.5, -0.08, 8.5);
  278.     glEnd();
  279.  
  280.     if (texturing)
  281.     glDisable(GL_TEXTURE_2D);
  282.  
  283.     glPopMatrix();
  284. }
  285.  
  286. void do_vlakje(void)
  287. {
  288.     glColor4f(1.0, 1.0, 1.0, 1.0);
  289.     glDisable(GL_LIGHTING);
  290.     glPushMatrix();
  291.     glTranslatef(-0.5, 0.0, -0.5);
  292.     glBegin(GL_QUADS);
  293.     glVertex3f(0.0, 0.0, 0.0);
  294.     glVertex3f(8.0, 0.0, 0.0);
  295.     glVertex3f(8.0, 0.0, 8.0);
  296.     glVertex3f(0.0, 0.0, 8.0);
  297.     glEnd();
  298.     glPopMatrix();
  299.     glEnable(GL_LIGHTING);
  300. }
  301.  
  302. void do_board(void)
  303. {
  304.     int x,y;
  305.  
  306.     glPushMatrix();
  307.     glTranslatef(-0.5, 0.0, -0.5);
  308.     white_texture();
  309.     if (texturing)
  310.     {
  311. #if !defined(USE_DISPLAY_LISTS)
  312.     glBindTexture(GL_TEXTURE_2D, texName[1]);
  313. #else
  314.         glCallList(texName[1]);
  315. #endif
  316.     glEnable(GL_TEXTURE_2D);
  317.     }
  318.  
  319.     glBegin(GL_QUADS);
  320.     glNormal3f(0.0, 1.0, 0.0);
  321.     for (x=0;x<8;x++)
  322.     {
  323.     for (y=x%2;y<8;y+=2)
  324.     {
  325.         glTexCoord2f(0.2*x, 0.2*y); glVertex3f(x, 0, y);
  326.         glTexCoord2f(0.17+0.2*x, 0.2*y); glVertex3f(x+1, 0, y);
  327.         glTexCoord2f(0.17+0.2*x, 0.17+0.2*y); glVertex3f(x+1, 0, y+1);
  328.         glTexCoord2f(0.2*x, 0.17+0.2*y); glVertex3f(x, 0, y+1);
  329.     }
  330.     }
  331.     glEnd();
  332.     if (texturing)
  333.     {
  334.     glDisable(GL_TEXTURE_2D);
  335.  
  336. #if !defined(USE_DISPLAY_LISTS)
  337.     glBindTexture(GL_TEXTURE_2D, texName[2]);
  338. #else
  339.         glCallList(texName[2]);
  340. #endif
  341.     glEnable(GL_TEXTURE_2D);
  342.     } else
  343.     black_texture();
  344.  
  345.     glBegin(GL_QUADS);
  346.     glNormal3f(0.0, 1.0, 0.0);
  347.     for (x=0;x<8;x++)
  348.     {
  349.     for (y=1-(x%2);y<8;y+=2)
  350.     {
  351.         glTexCoord2f(0.2*x, 0.2*y); glVertex3f(x, 0, y);
  352.         glTexCoord2f(0.17+0.2*x, 0.2*y); glVertex3f(x+1, 0, y);
  353.         glTexCoord2f(0.17+0.2*x, 0.17+0.2*y); glVertex3f(x+1, 0, y+1);
  354.         glTexCoord2f(0.2*x, 0.17+0.2*y); glVertex3f(x, 0, y+1);
  355.     }
  356.     }
  357.     glEnd();
  358.     if (texturing)
  359.     glDisable(GL_TEXTURE_2D);
  360.     glPopMatrix();
  361. }
  362.  
  363. void do_solid(GLfloat *f, int sz, GLfloat width)
  364. {
  365.     GLfloat nx, ny, s;
  366.     GLfloat length;
  367.     int i,j;
  368.  
  369.     for (i=0;i<sz;i++)
  370.     buf[i] = f[i]/4.2;
  371.  
  372.     for (i=0;i<sz;i+=2)
  373.     {
  374.     buf[i+1] = buf[i+1] * (1 - cos(phase)/3);
  375.     buf[i] = buf[i] * (1+sin(M_PI*buf[i+1]/buf[1])*cos(phase)*0.7);
  376. /*
  377.     if (buf[i] > bwidth)
  378.         bwidth = buf[i];
  379. */
  380.     if (buf[i+1] > bheight)
  381.         bheight = buf[i+1];
  382.     }
  383.  
  384.     glBegin(GL_QUAD_STRIP);
  385.     for (i=2;i<sz;i+=2)
  386.     {
  387.     if (buf[i+3] == buf[i+1] && buf[i+2] == buf[i])
  388.         continue;
  389.     nx = buf[i-1] + buf[i+3];
  390.     ny = buf[i+2] - buf[i];
  391.     length = sqrt(nx*nx+ny*ny);
  392.     nx = nx/length;
  393.     ny = ny/length;
  394.  
  395.     s = (1+cos(phase)*0.7);
  396.     glNormal3f(0.0, ny, nx);
  397.     glVertex3f(width*s, buf[i+1], buf[i]);
  398.     glVertex3f(-width*s, buf[i+1], buf[i]);
  399.     }
  400.     glEnd();
  401.  
  402.     glNormal3f(-1.0, 0.0, 0.0);
  403.     i = 2; j = sz-4;
  404.     glBegin(GL_TRIANGLE_STRIP);
  405.     while (i < j)
  406.     {
  407.     while (buf[i-1] == buf[i+1] && buf[i-2] == buf[i] && i < j)
  408.         i += 2;
  409.     if (i < j)
  410.     {
  411.         s = (1+cos(phase)*0.7);
  412.         glVertex3f(-width*s, buf[i+1], buf[i]);
  413.     }
  414.     i += 2;
  415.     while (buf[j-1] == buf[j+1] && buf[j-2] == buf[j] && i < j)
  416.         j -= 2;
  417.     if (i < j)
  418.     {
  419.         s = (1+cos(phase)*0.7);
  420.         glVertex3f(-width*s, buf[j+1], buf[j]);
  421.     }
  422.     j -= 2;
  423.     }
  424.     glEnd();
  425.  
  426.     i = 2; j = sz-4;
  427.     glBegin(GL_TRIANGLE_STRIP);
  428.     glNormal3f(1.0, 0.0, 0.0);
  429.     while (i < j)
  430.     {
  431.     while (buf[i-1] == buf[i+1] && buf[i-2] == buf[i] && i < j)
  432.         i += 2;
  433.     if (i < j)
  434.     {
  435.         s = (1+cos(phase)*0.7);
  436.         glVertex3f(width*s, buf[i+1], buf[i]);
  437.     }
  438.     i += 2;
  439.     while (buf[j-1] == buf[j+1] && buf[j-2] == buf[j] && i < j)
  440.         j -= 2;
  441.     if (i < j)
  442.     {
  443.         s = (1+cos(phase)*0.7);
  444.         glVertex3f(width*s, buf[j+1], buf[j]);
  445.     }
  446.     j -= 2;
  447.     }
  448.     glEnd();
  449. }
  450.  
  451. void do_rotate(GLfloat *f, int sz)
  452. {
  453.     GLfloat nx, ny;
  454.     GLfloat length;
  455.     GLfloat a, c, s;
  456.     int i,j;
  457.  
  458.     bheight = 0;
  459.     bwidth = 0;
  460.  
  461.     for (i=0;i<sz;i++)
  462.     buf[i] = f[i] / 4.2;
  463.  
  464.     for (i=0;i<sz;i+=2)
  465.     {
  466.     buf[i+1] = buf[i+1] * (1 - cos(phase)/3);
  467.     buf[i] = buf[i] * (1+sin(M_PI*buf[i+1]/buf[1])*cos(phase)*0.7);
  468.     if (buf[i] > bwidth)
  469.         bwidth = buf[i];
  470.     if (buf[i+1] > bheight)
  471.         bheight = buf[i+1];
  472.     }
  473.  
  474.     for (i=2;i<sz-4;i+=2)
  475.     {
  476.     if (fabs(buf[i+3]+buf[i+1]) +fabs(buf[i+2]+buf[i]) < 0.0001)
  477.         continue;
  478.     glBegin(GL_QUAD_STRIP);
  479.     for (j=0;j<=ACC;j++)
  480.     {
  481.         a = ((float) j)*M_PI*2/ACC;
  482.         c = cos(a);
  483.         s = sin(a);
  484.         nx = buf[i-1] + buf[i+3];
  485.         ny = buf[i+2] - buf[i];
  486.         length = sqrt(nx*nx+ny*ny);
  487.         nx = nx/length;
  488.         ny = ny/length;
  489.         glNormal3f(c*nx, ny, s*nx);
  490.         glVertex3f(c*buf[i], buf[i+1], s*buf[i]);
  491.  
  492.         nx = buf[i-1] + buf[i+3];
  493.         ny = buf[i+2] - buf[i];
  494.         length = sqrt(nx*nx+ny*ny);
  495.         nx = nx/length;
  496.         ny = ny/length;
  497.         glNormal3f(c*nx, ny, s*nx);
  498.         glVertex3f(c*buf[i+2], buf[i+3], s*buf[i+2]);
  499.     }
  500.     glEnd();
  501.     }
  502. }
  503.  
  504. GLfloat pion_data[] = {
  505.     -0.04, 3.000,   0.000, 0.000,   0.000, 0.000,   0.000, 0.000,
  506.     0.000, 0.000,   0.000, 0.000,   0.000, 0.000,   0.000, 0.000,
  507.     0.200, 2.000,   0.560, 1.900,   0.560, 1.800,   0.300, 1.800,
  508.     0.300, 1.800,   0.520, 1.030,   0.520, 1.030,   0.550, 1.030,
  509.     0.550, 1.030,   0.670, 0.670,   0.940, 0.450,   0.940, 0.300,
  510.     0.840, 0.300,   0.840, 0.150,   0.940, 0.150,   0.940, 0.000,
  511.     0.940, 0.000,    0.000, 0.000,    0.000, 0.000
  512. };
  513.  
  514. void prepare_pion(void)
  515. {
  516.     int i;
  517.     GLfloat a, c, s;
  518.     for (i=0;i<7;i++)
  519.     {
  520.     a = ((GLfloat) i)*M_PI/8;
  521.     s = sin(a);
  522.     c = cos(a);
  523.     pion_data[2+i*2] = s*0.56;
  524.     pion_data[3+i*2] = c*0.56+2.44;
  525.     }
  526.     pion_data[2+i*2] = pion_data[i*2];
  527.     pion_data[3+i*2] = pion_data[i*2+1];
  528. }
  529.  
  530. void do_pion(void)
  531. {
  532.     do_rotate(pion_data, sizeof(pion_data)/sizeof(GLfloat));
  533. }
  534.  
  535. GLfloat toren_data[] = {
  536.     -0.04, 3.000,    0.000, 3.000,    0.600, 3.000,    0.600, 3.000,
  537.     0.600, 3.200,    0.600, 3.200,    0.800, 3.200,    0.800, 3.200,
  538.     0.800, 3.200,    0.600, 2.700,    0.600, 2.700,    0.550, 2.700,
  539.     0.550, 2.700,    0.700, 1.200,    0.700, 1.200,    0.730, 1.200,
  540.     0.730, 1.200,   0.850, 0.850,    1.050, 0.500,    1.050, 0.500,
  541.     1.050, 0.300,    0.950, 0.350,    0.950, 0.150,    1.050, 0.150,
  542.     1.050, 0.000,    1.050, 0.000,    0.000, 0.000,    0.000, 0.000
  543. };
  544.     
  545. void do_toren(void)
  546. {
  547.     int i;
  548.     GLfloat a1, a2, c1, s1, c2, s2, h1, h2;
  549.     do_rotate(toren_data, sizeof(toren_data)/sizeof(GLfloat));
  550.     h1 = buf[9];
  551.     h2 = buf[9] + buf[9] - buf[3];
  552.     for (i=0;i<ACC;i++)
  553.     {
  554.     if ((i*8/ACC)%2)
  555.     {
  556.         a1 = ((GLfloat) i)*M_PI*2/ACC;
  557.         s1 = cos(a1);
  558.         c1 = sin(a1);
  559.         a2 = ((GLfloat) i+1)*M_PI*2/ACC;
  560.         s2 = cos(a2);
  561.         c2 = sin(a2);
  562.  
  563.         glBegin(GL_QUADS);
  564.         glNormal3f(c1, 0.0, s1);
  565.         glVertex3f(0.143*c1, h1, 0.143*s1);
  566.         glVertex3f(0.143*c1, h2, 0.143*s1);
  567.         glNormal3f(c2, 0.0, s2);
  568.         glVertex3f(0.143*c2, h2, 0.143*s2);
  569.         glVertex3f(0.143*c2, h1, 0.143*s2);
  570.         glEnd();
  571.  
  572.         glBegin(GL_QUADS);
  573.         glNormal3f(0.0, 1.0, 0.0);
  574.         glVertex3f(0.143*c1, h2, 0.143*s1);
  575.         glVertex3f(0.190*c1, h2, 0.190*s1);
  576.         glVertex3f(0.190*c2, h2, 0.190*s2);
  577.         glVertex3f(0.143*c2, h2, 0.143*s2);
  578.         glEnd();
  579.  
  580.         glBegin(GL_QUADS);
  581.         glNormal3f(c1, 0.0, s1);
  582.         glVertex3f(0.190*c1, h1, 0.190*s1);
  583.         glVertex3f(0.190*c1, h2, 0.190*s1);
  584.         glNormal3f(c2, 0.0, s2);
  585.         glVertex3f(0.190*c2, h2, 0.190*s2);
  586.         glVertex3f(0.190*c2, h1, 0.190*s2);
  587.         glEnd();
  588.     }
  589.     }
  590.     for (i=0;i<ACC;i++)
  591.     {
  592.     if (!((i*8) % ACC))
  593.     {
  594.         a1 = ((GLfloat) i)*M_PI*2/ACC;
  595.         s1 = cos(a1);
  596.         c1 = sin(a1);
  597.         glBegin(GL_QUADS);
  598.         glNormal3f(s1, 0.0, -c1);
  599.         glVertex3f(c1*0.143, h1, s1*0.143);
  600.         glVertex3f(c1*0.190, h1, s1*0.190);
  601.         glVertex3f(c1*0.190, h2, s1*0.190);
  602.         glVertex3f(c1*0.143, h2, s1*0.143);
  603.         glEnd();
  604.     }
  605.     }
  606. }
  607.  
  608. GLfloat paard_data[] = {
  609.     -0.04, 1.950,    0.200, 1.950,    0.200, 1.950,    0.200, 1.550,
  610.     0.200, 1.550,    0.650, 1.550,    0.650, 1.550,    0.700, 1.400,
  611.     0.700, 1.100,
  612.     0.850, 0.850,    1.050, 0.500,    1.050, 0.500,    1.050, 0.300,
  613.     0.950, 0.350,    0.950, 0.150,    1.050, 0.150,    1.050, 0.000,
  614.     1.050, 0.000,    0.000, 0.000,    0.000, 0.000
  615. };
  616.  
  617. GLfloat paard_data2[] = {
  618.     0.000, 1.600,    0.500, 1.600,    0.500, 1.600,    0.800, 2.800,
  619.     0.870, 3.000,    0.550, 3.500,    0.000, 4.000,    -0.30, 4.300,
  620.     -0.30, 4.300,    -0.50, 3.850,    -0.50, 3.850,    -0.85, 3.500,
  621.     -0.85, 3.500,    -0.85, 3.200,    -0.85, 3.200,    -0.20, 3.000,
  622.     -0.20, 3.000,    -0.45, 2.500,    -0.80, 2.350,    -0.80, 2.350,
  623.     -0.65, 1.600,    0.000, 1.600
  624. };
  625.  
  626. void do_paard(void)
  627. {
  628.     do_rotate(paard_data, sizeof(paard_data)/sizeof(GLfloat));
  629.     do_solid(paard_data2, sizeof(paard_data2)/sizeof(GLfloat), 0.08);
  630. }
  631.     
  632. GLfloat loper_data[] = {
  633.     -0.20, 4.700,    0.000, 4.600,    0.250, 4.450,    0.150, 4.350,
  634.     0.150, 4.350,    0.500, 3.900,    0.640, 3.500,    0.450, 3.100,
  635.     0.450, 3.100,    0.580, 3.050,    0.450, 3.000,    0.450, 3.000,
  636.     0.450, 2.700,    0.450, 2.700,    0.560, 2.650,    0.520, 2.600,
  637.     0.520, 2.600,    0.700, 2.500,   0.740, 2.450,    0.700, 2.400,
  638.     0.300, 2.300,    0.300, 2.300,    0.500, 1.150,    0.500, 1.150,
  639.     0.550, 1.150,    0.550, 1.150,
  640.     0.850, 0.850,    1.050, 0.500,    1.050, 0.500,    1.050, 0.300,
  641.     0.950, 0.350,    0.950, 0.150,    1.050, 0.150,    1.050, 0.000,
  642.     1.050, 0.000,    0.000, 0.000,    0.000, 0.000
  643. };
  644.  
  645. void do_loper(void)
  646. {
  647.     do_rotate(loper_data, sizeof(loper_data)/sizeof(GLfloat));
  648. }
  649.  
  650. GLfloat koning_data[] = {
  651.     -0.20, 5.600,
  652.     0.000, 5.600,    0.300, 5.600,    0.550, 5.400,    0.850, 5.400,
  653.     0.554, 4.350,    0.554, 4.350,    0.650, 4.250,    0.550, 4.150,
  654.     0.550, 4.150,    0.550, 3.900,    0.551, 3.900,    0.750, 3.650,
  655.     0.750, 3.651,    0.751, 3.651,    0.920, 3.550,    0.500, 3.450,
  656.     0.500, 3.450,
  657.     0.500, 3.400,    0.650, 1.600,    0.700, 1.600,    0.750, 1.600,
  658.     1.150, 0.850,    1.200, 0.800,    1.200, 0.500,    1.200, 0.500,
  659.     1.100, 0.400,    1.200, 0.300,    1.200, 0.300,    1.200, 0.000,
  660.     1.200, 0.000,    0.000, 0.000,    0.000, 0.000
  661. };
  662.  
  663. GLfloat koning_data2[] = {
  664.     0.000, 5.400,    0.200, 5.400,
  665.     0.200, 5.400,    0.200, 7.000,    0.200, 7.000,    -0.20, 7.000,
  666.     -0.20, 7.000,    -0.20, 5.400,    -0.20, 5.400,    0.000, 5.400,
  667. };
  668.  
  669. GLfloat koning_data3[] = {
  670.     0.000, 6.100,    0.700, 6.100,    0.700, 6.100,    0.700, 6.500,
  671.     0.700, 6.500,    -0.70, 6.500,    -0.70, 6.500,    -0.70, 6.100,
  672.     -0.70, 6.100,    0.000, 6.100
  673. };
  674.  
  675. void prepare_koning(void)
  676. {
  677. /*
  678.  * I used much data from the dame for the koning, but the koning it a little
  679.  * bit bigger, so....
  680.  */
  681.     int i;
  682.     for (i=0;i<sizeof(koning_data)/sizeof(GLfloat);i+=2)
  683.     {
  684.     koning_data[i] = koning_data[i] * 0.95;
  685.     koning_data[i+1] = koning_data[i+1] * 1.05;
  686.     }
  687.     for (i=0;i<sizeof(koning_data2)/sizeof(GLfloat);i++)
  688.     koning_data2[i] = koning_data2[i] * 1.05;
  689.     for (i=0;i<sizeof(koning_data3)/sizeof(GLfloat);i++)
  690.     koning_data3[i] = koning_data3[i] * 1.05;
  691. }
  692.  
  693. void do_koning(void)
  694. {
  695.     do_rotate(koning_data, sizeof(koning_data)/sizeof(GLfloat));
  696.     glRotatef(90.0, 0.0, 1.0, 0.0);
  697.     do_solid(koning_data2, sizeof(koning_data2)/sizeof(GLfloat), 0.05);
  698.     do_solid(koning_data3, sizeof(koning_data3)/sizeof(GLfloat), 0.05);
  699. }
  700.  
  701. GLfloat dame_data[] = {
  702.     -0.20, 6.000,    0.000, 6.000,    0.300, 5.850,    0.200, 5.700,
  703.     0.300, 5.600,
  704.     0.301, 5.600,    0.550, 5.400,    0.550, 5.400,    0.850, 5.400,
  705.     0.800, 5.400,    0.800, 5.000,    0.800, 5.000,    0.650, 4.750,
  706.     0.554, 4.350,    0.554, 4.350,    0.650, 4.250,    0.550, 4.150,
  707.     0.550, 4.150,    0.550, 3.900,    0.551, 3.900,    0.750, 3.650,
  708.     0.750, 3.651,    0.751, 3.651,    0.920, 3.550,    0.500, 3.450,
  709.     0.500, 3.400,    0.650, 1.600,    0.700, 1.600,    0.750, 1.600,
  710.     1.150, 0.850,    1.200, 0.800,    1.200, 0.500,    1.200, 0.500,
  711.     1.100, 0.400,    1.200, 0.300,    1.200, 0.300,    1.200, 0.000,
  712.     1.200, 0.000,    0.000, 0.000,    0.000, 0.000
  713. };
  714.  
  715. void do_dame(void)
  716. {
  717.     do_rotate(dame_data, sizeof(dame_data)/sizeof(GLfloat));
  718. }
  719.  
  720. void init_lists(void)
  721. {
  722.     int i,j;
  723.  
  724.     printf("Generating textures.\n");
  725.     init_textures();
  726.  
  727.     for (i=0;i<17;i++)
  728.     transl[i+12] = transl[44-i] = sin(((GLfloat) i)*M_PI/32)/1.5;
  729.  
  730.     for (i=0;i<17;i++)
  731.     list[i+8] = list[40-i] = i*8;
  732.  
  733.     for (i=0;i<8;i++)
  734.     list[40+i] = list[7-i] = i*8;
  735.  
  736.     printf("Generating display lists.\n");
  737.  
  738.     prepare_pion();
  739.     prepare_koning();
  740.     for (i=0;i<=16;i++)
  741.     {
  742.     phase = ((GLfloat) i) * M_PI/16.0;
  743.     glNewList(PION + 8*i, GL_COMPILE);
  744.     width[PION+8*i] = bwidth;
  745.     height[PION+8*i] = bheight;
  746.     do_pion();
  747.     glEndList();
  748.  
  749.     glNewList(TOREN + 8*i, GL_COMPILE);
  750.     do_toren();
  751.     width[TOREN+8*i] = bwidth;
  752.     height[TOREN+8*i] = bheight;
  753.     glEndList();
  754.  
  755.     glNewList(PAARD + 8*i, GL_COMPILE);
  756.     do_paard();
  757.     width[PAARD+8*i] = bwidth;
  758.     height[PAARD+8*i] = bheight;
  759.     glEndList();
  760.  
  761.     glNewList(LOPER + 8*i, GL_COMPILE);
  762.     do_loper();
  763.     width[LOPER+8*i] = bwidth;
  764.     height[LOPER+8*i] = bheight;
  765.     glEndList();
  766.  
  767.     glNewList(KONING + 8*i, GL_COMPILE);
  768.     do_koning();
  769.     width[KONING+8*i] = bwidth;
  770.     height[KONING+8*i] = bheight;
  771.     glEndList();
  772.  
  773.     glNewList(DAME + 8*i, GL_COMPILE);
  774.     do_dame();
  775.     width[DAME+8*i] = bwidth;
  776.     height[DAME+8*i] = bheight;
  777.     glEndList();
  778.     }
  779.  
  780.     for (i=0;i<10;i++)
  781.     for (j=0;j<10;j++)
  782.     {
  783.         board[i][j] = 0;
  784.         cycle[i][j] = -1;
  785.     }
  786.  
  787.     for (i=1;i<9;i++)
  788.     {
  789.     board[i][2] = PION + WIT;
  790.     board[i][7] = PION + ZWART;
  791.     }
  792.     board[1][1] = board[8][1] = TOREN + WIT;
  793.     board[2][1] = board[7][1] = PAARD + WIT;
  794.     board[3][1] = board[6][1] = LOPER + WIT;
  795.     board[4][1] = DAME + WIT;
  796.     board[5][1] = KONING + WIT;
  797.  
  798.     board[1][8] = board[8][8] = TOREN + ZWART;
  799.     board[2][8] = board[7][8] = PAARD + ZWART;
  800.     board[3][8] = board[6][8] = LOPER + ZWART;
  801.     board[4][8] = DAME + ZWART;
  802.     board[5][8] = KONING + ZWART;
  803.     read_move();
  804. }
  805.  
  806. extern int speed;
  807.  
  808. void do_piece(int pc, GLfloat x, GLfloat y, int *st, int *cl, int color)
  809. {
  810.     GLfloat a, s;
  811.  
  812.     if (*cl >= 0)
  813.     (*cl)++;
  814.     if (*cl < 0 && ((rand()%300) < 4) && chaos)
  815.     {
  816.     chaosPieces++;
  817.     *cl = 0;
  818.     *st = rand() % 6;
  819.     }
  820.     if (*cl >= 48) {
  821.     chaosPieces--;
  822.     if (chaosPieces == 0 && !chaos) {
  823.         if (!animating && (speed == 0))
  824.         glutIdleFunc(NULL);
  825.     }
  826.     *cl = -1;
  827.     }
  828.  
  829.     if (*cl < 0)
  830.     {
  831.     glPushMatrix();
  832.     glTranslatef(x - 1.0, ((x==CX2 && y==CY2)?CZ2:0.0), 8.0 - y);
  833.     if (color == ZWART && pc == PAARD)
  834.         glRotatef(180.0, 0.0, 1.0, 0.0);
  835.     glScalef(1.2, 1.2, 1.2);
  836.     glCallList(pc+list[0]);
  837.     glPopMatrix();
  838.     return;
  839.     }
  840.  
  841.     glPushMatrix();
  842.     switch (*st)
  843.     {
  844.     case 0:
  845.         glTranslatef(x - 1.0, transl[(*cl)>=0?*cl:0] +
  846.         ((x==CX2 && y==CY2)?CZ2:0.0), 8.0 - y);
  847.         if (color == ZWART && pc == PAARD)
  848.         glRotatef(180.0, 0.0, 1.0, 0.0);
  849.         glScalef(1.2, 1.2, 1.2);
  850.         glCallList(list[(*cl)>=0?*cl:0]+pc);
  851.         break;
  852.     case 1:
  853.     case 2:
  854.         glTranslatef(x - 1.0, transl[(*cl)>=0?*cl:0] +
  855.         ((x==CX2 && y==CY2)?CZ2:0.0), 8.0 - y);
  856.         if (color == ZWART && pc == PAARD)
  857.         glRotatef(180.0, 0.0, 1.0, 0.0);
  858.         if ((*cl > 16) && (*cl < 32))
  859.         {
  860.         glTranslatef(0.0, height[list[*cl]+pc]/2, 0.0);
  861.         if (*st == 1)
  862.             glRotatef(((*cl)-16) * 22.5, 1.0, 0.0, 0.0);
  863.         else
  864.             glRotatef(-((*cl)-16) * 22.5, 1.0, 0.0, 0.0);
  865.         glTranslatef(0.0, -height[list[*cl]+pc]/2, 0.0);
  866.         }
  867.         glScalef(1.2, 1.2, 1.2);
  868.         glCallList(list[*cl]+pc);
  869.         break;
  870.     case 3:
  871.         glTranslatef(x - 1.0, ((x==CX2 && y==CY2)?CZ2:0.0), 8.0 - y);
  872.         if (color == ZWART && pc == PAARD)
  873.         glRotatef(180.0, 0.0, 1.0, 0.0);
  874.         a = ((GLfloat) (*cl)) * M_PI / 12;
  875.         s = sin(a);
  876.         glRotatef(15*s, 0.0, 0.0, 1.0);
  877.         glTranslatef(0.0, width[list[0]+pc]*s*s, 0.0);
  878.         glScalef(1.2, 1.2, 1.2);
  879.         glCallList(list[0] + pc);
  880.         break;
  881.     default:
  882.         glTranslatef(x - 1.0, ((x==CX2 && y==CY2)?CZ2:0.0), 8.0 - y);
  883.         if (color == ZWART && pc == PAARD)
  884.         glRotatef(180.0, 0.0, 1.0, 0.0);
  885.         a = ((GLfloat) (*cl)) * M_PI / 12;
  886.         s = sin(a);
  887.         glRotatef(15*s, 0.0, 0.0, 1.0);
  888.         glRotatef((*cl) * 30, 0.0, 1.0, 0.0);
  889.         glTranslatef(0.0, width[list[0]+pc]*s*s, 0.0);
  890.         glScalef(1.2, 1.2, 1.2);
  891.         glCallList(list[0]+pc);
  892.         break;
  893.     }
  894.     glPopMatrix();
  895. }
  896.  
  897. void do_pieces(void)
  898. {
  899.     int i,j;
  900.  
  901.     copper_texture();
  902.     for (i=0;i<10;i++)
  903.     {
  904.     for (j=0;j<10;j++)
  905.     {
  906.         if (board[i][j]&16 || !(board[i][j]&15))
  907.         continue;
  908.         do_piece(board[i][j]&15, i, j, &stunt[i][j], &cycle[i][j], WIT);
  909.     }
  910.     }
  911.  
  912.     if ((piece&16) == WIT && piece > 0)
  913.     {
  914.     glPushMatrix();
  915.     glTranslatef(0.0, 0.2, 0.0);
  916.     do_piece(piece&15, CX1, CY1, &stuntm, &cyclem, WIT);
  917.     glPopMatrix();
  918.     }
  919.  
  920.     if ((piece2&16) == WIT && piece2 > 0)
  921.     do_piece(piece2&15, CX2, CY1, &stunt2, &cycle2, WIT);
  922.  
  923.     dark_texture();
  924.     for (i=0;i<10;i++)
  925.     {
  926.     for (j=0;j<10;j++)
  927.     {
  928.         if (!(board[i][j]&16) || !board[i][j])
  929.         continue;
  930.         do_piece(board[i][j]&15, i, j, &stunt[i][j], &cycle[i][j], ZWART);
  931.     }
  932.     }
  933.  
  934.     if ((piece&16) == ZWART && piece > 0)
  935.     {
  936.     glPushMatrix();
  937.     glTranslatef(0.0, 0.2, 0.0);
  938.     do_piece(piece&15, CX1, CY1, &stuntm, &cyclem, ZWART);
  939.     glPopMatrix();
  940.     }
  941.  
  942.     if ((piece2&16) == ZWART && piece2 > 0)
  943.     do_piece(piece2&15, CX2, CY2, &stunt2, &cycle2, ZWART);
  944. }
  945.  
  946. void do_display(void)
  947. {
  948.     glDisable(GL_DEPTH_TEST);
  949.     /* glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_FALSE); */
  950.     if (reflection) {
  951.       glEnable(GL_STENCIL_TEST);
  952.       glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE);
  953.       glStencilFunc(GL_ALWAYS, 1, 0xffffffff);
  954.     }
  955.     do_vlakje();
  956.     glEnable(GL_DEPTH_TEST);
  957.     glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
  958.  
  959.     if (reflection)
  960.     {
  961.     glStencilFunc(GL_EQUAL, 1, 0xffffffff);
  962.     glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
  963.  
  964.     glPushMatrix();
  965.     glScalef(1.0, -1.0, 1.0);
  966.     glLightfv(GL_LIGHT0, GL_POSITION, lightpos);
  967.     glClipPlane(GL_CLIP_PLANE1, ClipPlane);
  968.     glEnable(GL_CLIP_PLANE1);
  969.     do_pieces();
  970.     glPopMatrix();
  971.     glDisable(GL_CLIP_PLANE1);
  972.         glDisable(GL_STENCIL_TEST);
  973.  
  974.     glLightfv(GL_LIGHT0, GL_POSITION, lightpos);
  975.     }
  976.  
  977. /*
  978.  * Also without texturing I want to blend, to keep the contrast of the board
  979.  * consistent.
  980.  */
  981.  
  982.     glEnable(GL_BLEND);
  983.     glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
  984.  
  985.     do_board();
  986.  
  987.     glDisable(GL_BLEND);
  988.  
  989.     do_border();
  990.  
  991.     glClipPlane(GL_CLIP_PLANE1, ClipPlane);
  992.     glEnable(GL_CLIP_PLANE1);
  993.     do_pieces();
  994.     glDisable(GL_CLIP_PLANE1);
  995. }
  996.